/**
 * 获取最新版本
 * 获取、设置网站信息、导航信息
 * 
 */

import config from '../config/index.js'
// 菜单
import menuController from './menu.js'
// 路由
import { useRouter } from '../router'
// 访问状态
import { store } from '@naturefw/nf-state'

let verInfo = null

/**
 * 项目相关的操作
 * * 获取最新版本，by axios
 * * 获取项目信息，by axios
 * * 获取项目信息，by indexedDB
 * * 保存项目信息，to indexedDB
 */
export default function projectController () {
  
  // 获取最新版本，by axios
  // 必须有 ver.json 文件，没有会出错。
  const loadNewVer = async () => {
    if  (verInfo) return verInfo
    const rnd = new Date().valueOf() // 获取最新文件
    const url = `${config.baseUrl}docs/.nfpress/ver.json?ver=${rnd}`
    const ver = await config.axios.get(url)
    // console.log('版本信息：', ver.data)
    verInfo = ver.data
    return verInfo
  }

  // 获取项目信息，包括导航信息 by axios
  // 必须有 project.json 文件，没有会出错。
  const loadProject = async (ver = 1) => {
    const url = `${config.baseUrl}docs/.nfpress/project.json?ver=${ver}`
    const projectInfo = await config.axios.get(url)
    // console.log('项目信息：', projectInfo.data)
    return projectInfo.data
  }
  
  // 从 indexedDB 里面加载 项目信息，
  // 如果有，判断版本
  // 如果没有，则用 axios 加载 
  const getProject = async () => {
    // 获取 indexedDB 里面的 【项目信息】的仓库对象
    const { project: dbProject } = config.help.stores()

    // 从 indexedDB 获取 项目信息
    const projectInfo = await dbProject.get()
    
    if (projectInfo.length > 0) {
      // indexedDB 里面有项目信息，判断是否最新版本
      const { ver } = await loadNewVer()
      if (ver == projectInfo[0].ver) {
        return projectInfo[0]
      } else {
        // 版本不同，获取新版本的项目信息
        const newProjectInfo = await loadProject(ver)
        // 设置版本号
        newProjectInfo.ver = ver
        // 保存
        dbProject.put(newProjectInfo)
        return newProjectInfo
      }
    } else {
      // 没有信息，用 axios 加载，没有处理找不到文件的情况。
      const projectInfo = await loadProject()
      // 添加
      dbProject.add(projectInfo)
      return projectInfo
    }
  }

  // 保存项目
  const saveProject = async (projectInfo) => {
    // 获取 indexedDB 里面的 【项目信息】的仓库对象
    const { project: dbProject } = config.help.stores()

    // 保存
    const res = await dbProject.save(projectInfo)
    return res
  }

  /**
   * 初始化设置
   */
  const docInit = async () => {
    // 获取状态
    const {
      projectInfo,
      naviList,
      menuList,
      current
    } = store

    // 获取网站信息和导航信息
    const projectInfos = await getProject()
    
    // 设置版本
    current.ver = projectInfos.ver

    // 设置网站信息
    projectInfo.$patch({
      projectId: projectInfos.projectId, 
      ver: projectInfos.ver, // 版本信息
      title: projectInfos.title,
      description: projectInfos.description
    })

    // 设置导航信息
    naviList.$state = projectInfos.navi

    // 获取菜单信息
    const { getMenu } = menuController()
    // 设置菜单信息
    menuList.$state = await getMenu(projectInfo.ver)

    const router = useRouter() // 路由
    if (router.menuPath.length === 0) { // 没有默认url
      // 设置默认导航项
      for (let i = 0; i < naviList.length; i++) {
        const nn = naviList[i]
        if (nn.link === 'menu') {
          current.naviId = nn.naviId
          break
        }
      }
    }

    return projectInfos

  }
  
  return {
    loadNewVer, // 获取版本号和数据库名称
    docInit, // 初始化
    loadProject, // 好像不需要导出去
    getProject, // 获取项目信息
    saveProject // 保存项目信息到 indexedDB
  }

}
